/**
 * 企业管理控制器 - 处理多租户企业的创建、查询、管理等REST API接口
 *
 * 开发人员：马勇俐
 * 开发时间：2025-11-16 至 2025-11-20
 * 模块职责：提供多租户企业相关的REST API接口，支持企业创建、查询、更新、删除等完整企业管理功能
 *
 * 技术要点：
 * - RESTful API设计，遵循REST规范
 * - 多租户架构，企业级数据隔离
 * - AOP审计日志记录操作轨迹
 * - 企业信用代码唯一性验证
 * - 企业状态管理和联系人信息维护
 *
 * 开发故事：负责企业管理控制器的开发，与企业服务层和前端企业界面深度配合，确保多租户企业的完整管理和数据安全性。
 */
package com.pbl.controller;

import com.pbl.aspect.AuditLog;
import com.pbl.common.model.ApiResponse;
import com.pbl.dto.EnterpriseDto;
import com.pbl.entity.Enterprise;
import com.pbl.service.EnterpriseService;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/enterprises")
public class EnterpriseController {

    private final EnterpriseService enterpriseService;

    /**
     * 构造企业控制器
     * @param enterpriseService 企业服务层
     */
    public EnterpriseController(EnterpriseService enterpriseService) {
        this.enterpriseService = enterpriseService;
    }

    @AuditLog(action = "enterprise.create", resource = "enterprise")
    @PostMapping
    public ApiResponse<Enterprise> create(@Valid @RequestBody EnterpriseDto dto) {
        Enterprise e = new Enterprise();
        e.setName(dto.getName());
        e.setCreditCode(dto.getCreditCode());
        e.setContactName(dto.getContactName());
        e.setContactPhone(dto.getContactPhone());
        e.setStatus(dto.getStatus());
        e.setRemark(dto.getRemark());
        return ApiResponse.success(enterpriseService.create(e));
    }

    @AuditLog(action = "enterprise.update", resource = "enterprise")
    @PutMapping("/{id}")
    public ApiResponse<Enterprise> update(@PathVariable Long id, @Valid @RequestBody EnterpriseDto dto) {
        Enterprise e = new Enterprise();
        e.setName(dto.getName());
        e.setCreditCode(dto.getCreditCode());
        e.setContactName(dto.getContactName());
        e.setContactPhone(dto.getContactPhone());
        e.setStatus(dto.getStatus());
        e.setRemark(dto.getRemark());
        return ApiResponse.success(enterpriseService.update(id, e));
    }

    @GetMapping("/{id}")
    public ApiResponse<Enterprise> get(@PathVariable Long id) {
        return ApiResponse.success(enterpriseService.get(id));
    }

    @AuditLog(action = "enterprise.delete", resource = "enterprise")
    @DeleteMapping("/{id}")
    public ApiResponse<Void> delete(@PathVariable Long id) {
        enterpriseService.delete(id);
        return ApiResponse.success();
    }

    @GetMapping
    public ApiResponse<List<Enterprise>> list() {
        return ApiResponse.success(enterpriseService.list());
    }
}
